#include <stdio.h>
#include <sys/types.h>
#include <pthread.h>

#include <semaphore.h>

#include <time.h>
#include <stdlib.h>
#include <unistd.h>

// 定义全局变量： 信号量
sem_t sem1;

int money = 1000;  // 当前余额， 一卡绑定了多人（亲人）
int ret = 0;
// 定义消费的任务函数， 间隔1s 花钱购买商品
void *consumer_task(void *arg){ 
    char *name = (char *)arg;
    while(1){   
        sem_wait(&sem1);  // P 
        if(money <= 0 ){
            sem_post(&sem1); // V  注意，退出线程时，必须V操作，否则会出现死锁
            break;
        } 
        int n = rand() % 10 + 1;  // 随机产生 [1, 10]
        if(money >= n){
            
            money -= n;
            printf("%s 花了 %d 元，余额 %d\n", name, n, money);
            ret += n;
        }
        sem_post(&sem1); // V
        // usleep(rand() % 1501 + 500);
    }
    printf("%s 购物结束\n",name);
    return NULL;
}

int main(int argc, char const *argv[])
{
    srand(time(NULL));

    // 初始化信号量(二值信号量： 1， 0)
    sem_init(&sem1, 0, 1);

    pthread_t tid1, tid2, tid3;
    pthread_create(&tid1, NULL, consumer_task, "老婆");
    pthread_create(&tid2, NULL, consumer_task, "女儿");
    pthread_create(&tid3, NULL, consumer_task, "儿子");

    pthread_join(tid1, NULL);
    pthread_join(tid2, NULL);
    pthread_join(tid3, NULL);
    printf("--over(余额：%d 花费总额： %d)--\n", money, ret);

    // 销毁信号量
    sem_destroy(&sem1);
    return 0;
}
